笨叔叔: 我的Linux内核学习经历
作者简介
笨叔叔, Linux内核爱好者,从事Linux内核和驱动开发十余年,在多家芯片公司从事过手机芯片底层软件开发和客户支持工作。
欢迎大家给Linuxer投稿,获得任意在售技术图书: Linuxer-"Linux开发者自己的媒体"首月稿件录取和赠书名单
我和宋宝华老师大约是在2010年时候在以个会议上认识,当时感觉很朴实、很睿智、很有才华。会议结束之后问了小姑娘才知道这位是大名鼎鼎的宋宝华老师。此后我一直有关注他的微信微博以及Linux驱动的书籍,是在国内一个很乐于分享技术的布道者,另外他还是Linux内核ARM SoC分支内的Maintainer之一。
非常荣幸能受到宋老师邀请在他的微信公众平台上分享一下我的Linux内核学习经验。我的笔名叫笨叔叔,是最近这一年自己给自己起的名字,因为最近自己不自量力写了一本《奔跑吧Linux内核》的书。我是一个很普通的工程师,虽然10几年来一直从事和Linux驱动以及内核的工作,可是却平平淡淡。至今还没有在社区发过一个patch,可以说是一个zero patch的Linux内核吃瓜叔叔了。可能和自己工作岗位有关系,从事Linux开发的工程师分为两种,一种是做产品的工程师,另外一种是做开源社区的工程师。我自己做的不够好,因此也谈不上有什么好的经验和大家分享,下面就随便瞎扯淡吧。
我的学习经历可以分成下面几个阶段吧。
1.毕业设计阶段。当年毕业设计阶段做单片机相关的,仰慕实验室的其他同学在学习Linux内核作为毕业设计。当时厚厚的几本Linux内核书籍吸引我了,我也偷偷的买了,只是心里咕嘟,不知道猴年马月才能看到懂。
2. 初入职场。第一份工作是在一家做ARM开发板的公司工作,有点类似FAE。可是就是这样的工作,让我从单片机过渡到了ARM处理器和Linux内核。从移植成熟的开发板开始玩起,从简单的字符设备读取做起,慢慢深入到驱动开发中。
3.独立开发驱动。离开第一家公司之后,在其他公司陆续独立开发了几个驱动程序,比如基于V4L1和V4L2的视频数据采集卡。独立开发驱动程序其实很锻炼人,首先需要对所写的硬件规范要很熟悉,其次对需要采用的内核接口和框架也要有所了解,然后才能开始写驱动程序,在调试过程中你会发现遇到很多问题,带着这些问题在深入思考。
4. ARM芯片系统移植。后来到了一家芯片公司,做基于ARM的手机芯片的。从基于ARM9开始,一直做到双核Cortex-A9以及4核Cortex-A7。做新芯片的系统移植比第一份工作的开发板移植要有意思的多,开发板移植的大部分工作芯片原厂就做完了。做芯片的,自己就是芯片原厂。需要和ARM core以及芯片内部的很多IP打交道。这样让我对ARM core和SoC内部实现有更深入的了解。
5.参与UKSM项目。有幸参与了和内存管理相关的一个项目,并且得到夏老师的悉心指导和点拨,让我对内存管理有了更深入的理解。
6.到了樱桃公司的手机部门做客户支持。我又回到做FAE的岗位了,可能有人瞧不起FAE,可是FAE可以让我从多方面了解Linux内核,而不局限于某一个技术点。比如说,有客户问,你们家芯片是怎么支持多CPU调度的?怎么支持大小核调度的?有时候从研发的角度思考问题会有一些技术的局限性,多接触一些不同的观点也是好事情,同时被客户吊打也是一种人生体验。我依然觉得技术是为产品服务的,多了解一下技术以外的事情也不是坏事。
7. 撰写《奔跑吧Linux内核》。因为有了上述研发和FAE的经验,加上《情景分析》十多年来一直没有人更新,我一直在等毛老师更新最新版本或者国内大牛来做这个事情。可是十多年了一直了无音讯,因此我就自告奋勇,冒着被天下读者吊打的风险来撰写一本基于《情景分析》的最新版本的内核书籍。《奔跑吧Linux内核》基于情景分析,但是由增加了一些新的构思,比如说基于实际问题来分析代码,以奔跑卷为开篇。书中里尽可能的多画一些图,每章之前有思考题,每章之后有总结等。总来的说就是“毛氏情景分析”+“笨氏吊打法”。
真要总结一些什么学习经验的话,我觉得有如下几点:
1. 要有一颗热情的心和对Linux充满了兴趣和好奇心。如果想在学习内核可以赚大钱,那真不必了,因为连Linux校长linus同志都没发大财。虽然这几年Linux内核的热情被云计算、AI、自动驾驶等新兴热点超越了,可是Linux内核作为基础设施未来几年还是很难被替代的,无论云计算、AI、自动驾驶还是ARM服务器等等,这些应用场景大部分还是运行在Linux内核之上,因此学习和掌握Linux内核还是必不可少的一门手艺。Linux内核像股市中的白马股和蓝筹股,虽然不在是被爆炒的热点,但依然星光璀璨。可以读读Linus同志的自传《Just for fun》。
2. 要有实际动手的机会。如果公司里有实际的Linux驱动或者内核项目,那是很好的锻炼机会。如果没有,那可以自己创造一个。比如可以按照《奔跑吧Linux内核》第6章的实验内容,采用Qemu+gdb+eclipse+O0调试方法来对感兴趣的内核模块进行单步调试,这样可以加深对内核代码的理解。另外也可以参与一些其他的开源项目,github上有不少很不错的内核开源项目
3. “笨氏吊打法”即要带着问题去看内核代码。这些问题可以是自己工作上遇到的问题,也可以是自己阅读代码中产生的疑问,总之你有疑问就不要放过,被客户吊打的问题更不能让它轻易溜走。内核代码变得越来越庞大,不带着好奇心和问题去看代码很容易在代码中迷失了方向。这也是《奔跑吧Linux内核》推崇的做法。拿mmap来说,相信很多驱动开发者或者应用开发者都用过这个API,可是有没有想过mmap是怎么实现的?使用mmap需要注意哪些方面?如果用户程序采用只读的方式来mmap文件内容到用户空间然后往这段进程地址空间写入,会发生什么情况?再比如get_user_page()这个函数,有不少驱动程序使用了它,你有没有想过它是如何实现,又是如何pin住物理页面的?
4. 参与内核社区开发。在这一点上,我给自己打分的话一定是0分。我自己没有参与过内核社区的开发,也没有一个patch,虽然定阅了Linux-mm的mailist,可是真的没有时间很认真的参与讨论。希望读者朋友们如果有时间和精力可以订阅自己感兴趣的mailist,尽可能的参与社区的讨论,这样对自己的提高是显著的。能参与开源社区的开发固然是好事,如果你是做产品研发的部门,没有时间和精力参与到社区里,其实也不用伤心,很多Linux专家也不在社区里混。参与一款好产品的研发也是一件很了不起的事情,因为好产品不仅仅是开源技术,还涉及好多方面。
总之一句话,带着问题去看内核代码,然后撸起袖子动手实践吧,这也是《奔跑吧Linux内核》给大家推荐的做法。
《奔跑吧Linux内核》经历了2年多的痛苦奔跑,终于和大家见面,我希望把我这10多年来对Linux的理解和被吊打的东西抽象出来与大家分享。作品不完美依然有不少瑕疵,期待读者慷慨的给出批评和吊打意见。
京东:http://item.jd.com/12152745.html?dist=jd
亚马逊:https://www.amazon.cn/dp/B074JV6WGN/ref=sr_1_1?ie=UTF8&qid=1502099486&sr=8-1
异步社区:http://www.epubit.com.cn/book/details/4835
当当:http://product.dangdang.com/25138842.html
笨叔叔联系方式:
微信号:runninglinuxkernel
微博/微信公众号:奔跑吧Linux内核
往期精彩回顾>>>
2017.8.14 《深入探究Linux的设备树》的ppt分享
考试:Linux/ARM 设备树(Device Tree)的知识自测题
让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型
...
公众号:linuxer
ID:LinuxDev
长按二维码关注我们